package agb.servlets;

/*
 * Control.java
 *
 * Creado el 24 de octubre de 2008, 08:08 PM
 */


import agb.Controlador.ConectaLOG;
import agb.Controlador.UsuarioLOG;
import agb.Controlador.UsuarioWeb;

import agb.servidor.ConexionBDDataSource;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.*;
import javax.servlet.http.*;






/**
 *
 * @author LIZARDO RIOS
 * @version
 */
public class SrvControl extends HttpServlet {
//    @Resource(name = "conBasePrueba")
//    private DataSource conBasePrueba;
    /*  Declaracion de Variables Globales */
    boolean estaConectado = false;
    String msgDriver = null;
    ServletContext m_context = null;        // Usado para escribir el archivo log
    HttpSession session=null;               // Para declarar variables de session
    String msgPool = null;
            
    @Override
    public void init(ServletConfig config)throws ServletException {
        super.init(config);
        conectarse();
    }
    
    public void conectarse() {
        if (!estaConectado) {
            ConexionBDDataSource conecta = new ConexionBDDataSource();
            
            //msgPool = conecta.getMensaje();
            estaConectado = (Boolean) conecta.estadoConexion();
        }
    }
    
    @Override
    public void destroy() 
    {
        if (estaConectado) {
            ConectaLOG conecta = new ConectaLOG();
            conecta.desconectarse();
            estaConectado = false;
        }
    }
    
    //Metodo que procesa las consultas
    public void procesaConsulta(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        //Datos de configuracion de la pagina web
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Obtención de datos del formulario</title></head>");
        
        //Obtenemos parametros enviados por la pagina web
        session = request.getSession(true);
        session.setAttribute("s_conectado", estaConectado);
        String pagina = request.getParameter("pagina");
        RequestDispatcher rd;   //Redirige la accion a otra pagina
        String next = null;     //Variable que almacena la pagina a redirigir
        String mensaje=null;    //Para mandar los mensajes al usuario 
        
        //Declaracion de variables
        int codPersona = 0;
        int codTipo = 0;
        String nombreTipo = "";
        String nombrePersona = "";
        boolean valido = false;
        ArrayList permisos = new ArrayList();
        String id = "0";
        int codigo = 0;
        boolean verificaID = false;
        String preguntaSecreta = "";
        String respuestaSecreta = "";
        String codAlumno = "0";
        ArrayList listaAnios = new ArrayList();
        ArrayList recuperaCuenta = new ArrayList();
        String carpeta = "";        
        String icono = "";
        int codUsuario;
        agb.Modelo.UsuarioWeb oUsuario = new agb.Modelo.UsuarioWeb();
        String opciones = null;
        String menu = null;
        String titulo = null;
        
        try {
            //Tipo de consulta del cliente
            int li_tipo_cons = 0;
            if(pagina != null) {
                if(pagina.equals("verificarUsuario")) {
                    li_tipo_cons = 1;
                }else if(pagina.equals("cerrarSesion")) {
                    li_tipo_cons = 2;
                }else if(pagina.equals("olvidoClave")) {
                    li_tipo_cons = 3;
                }else if(pagina.equals("recuperarClave")) {
                    li_tipo_cons = 4;
                }else if(pagina.equals("inicio")) {
                    li_tipo_cons = 5;
                }else if(pagina.equals("iniciarSesion")) {
                    li_tipo_cons = 6;
                }else if (pagina.equals("desconectarse")) {
                    li_tipo_cons = 7;
                }
            }
            
            //Manejamos las distintas paginas por estados
            switch (li_tipo_cons) {
                case 1: //Valida los datos del usuario
                    conectarse();
                    if (estaConectado) { 
                        String strLogin = (String)request.getParameter("txtUsuario").trim();
                        String strPassword = (String)request.getParameter("txtClave").trim();
                        
                        if (true) {
                            UsuarioWeb bUsuarioWeb = new UsuarioWeb(true); //para no entrar a inicializar variables de paginacion
                            UsuarioLOG lUsuarioWeb = new UsuarioLOG();
                        
                            bUsuarioWeb.setAlias(strLogin);
                            bUsuarioWeb.setClave(strPassword);
                            lUsuarioWeb.buscaUsuario(bUsuarioWeb, true);
                            oUsuario = agb.Modelo.UsuarioWeb.buscaUsuarioWeb(strLogin, strPassword);
                            codPersona = bUsuarioWeb.getCodPersona();
                            codTipo = bUsuarioWeb.getCodTipoUsuarioWeb();
                            
                           codUsuario = oUsuario.getCodUsuarioWeb();
                            nombreTipo = bUsuarioWeb.getTipoUsuario();
                            nombrePersona = bUsuarioWeb.getNombrePersona();
                            valido = bUsuarioWeb.getValido();
                        }
                        if (session.getAttribute("s_codigo_persona") != null) {
                            mensaje = "Su sesión ya ha sido iniciada anteriormente.";
                            request.setAttribute("r_mensaje", mensaje);
                            request.setAttribute("r_msg1", "Pruebe cerrando sesión, para que pueda ingresar.");
                            request.setAttribute("r_msg2", "No divigulge su claves son personales");
                            request.setAttribute("r_msg3", "En caso de que no pueda entrar consultar con su administrador");
                            request.setAttribute("r_cerrar", true);
                            next="/dinamica/mensaje.jsp";
                        } else {
                            if (valido) {
                                session.setAttribute("s_codigo_persona", codPersona);
                                session.setAttribute("s_tipo_usuario_web", nombreTipo);
                                System.out.println("TIPO");
                                switch(codTipo) {
                                    case 0: // NO ES USUARIO
                                        mensaje = "Este usuario tiene datos nulos revise la funcion logica.buscaUsuario(...)";
                                        session.setAttribute("s_mensaje", mensaje);
                                        next="/dinamica/mensaje.jsp";
                                        break;
                                    case 1: // ADMINISTRADOR DE SISTEMAS
                                        carpeta = "administrador";
                                        opciones = "dinamica/"+ carpeta +"/include_usuarios/opciones.jsp";
                                        menu = "dinamica/"+ carpeta +"/menu.html";
                                        titulo = "dinamica/titulo.jsp?titulo=Usuario";
                                        session.setAttribute("s_cod_persona", ""+codPersona);
                                        session.setAttribute("codUsuario", ""+codUsuario);
                                        next ="/dinamica/inicioPerfil.jsp?opciones=" + opciones;
                                        next+="&menu=" + menu + "&titulo=" + titulo;
                                        break;
                                    case 2: // OPERADOR DE SISTEMAS
                                        carpeta = "operador";
                                        break;
                                    case 3: // ALUMNO
                                        carpeta = "alumno";
                                        if (codPersona !=0 ) {
                                            session.setAttribute("s_nombre_alumno",nombrePersona);
//                                            NotaPeriodo bNotaPeriodo = new NotaPeriodo();
//                                            bNotaPeriodo.setCodPersona(codPersona);
//                                            NotaPeriodoLOG lNotasPeriodo = new NotaPeriodoLOG();
//                                            codAlumno = (String) lNotasPeriodo.dameCodigoAlumno(bNotaPeriodo);
//                                            session.setAttribute("s_codigo_alumno", codAlumno);
//                                            nombrePersona += " - " + codAlumno;
//                                            listaAnios = lNotasPeriodo.dameAnios(bNotaPeriodo);
                                            session.setAttribute("s_lista_anios", listaAnios);
                                            session.setAttribute("s_cod_persona", ""+codPersona);
                                            //establecer valores iniciales
                                            session.setAttribute("s_anio", "");
                                            session.setAttribute("s_cod_Periodo", "0");
                                            session.setAttribute("s_nombre_grado", "");
                                            session.setAttribute("codUsuario", ""+codUsuario);
                                            //next="/dinamica/apoderado/include_consulta/notas_x_periodo.jsp";
                                        }
                                        
                                        next="/dinamica/alumno/inicio.html";
                                        break;
                                    case 4: // APODERADO
                                        carpeta = "apoderado";
                                        if (codPersona !=0 ) {
                                            ArrayList listaCodAlumnos = new ArrayList();
                                            if (true) {
                                                UsuarioLOG lUsuarioWeb = new UsuarioLOG();
                                                listaCodAlumnos = lUsuarioWeb.buscaCodigosAlumnos(codPersona);
                                                session.setAttribute("s_lista_codigos_alumnos", listaCodAlumnos);
                                                session.setAttribute("s_cod_persona", ""+codPersona);
                                                session.setAttribute("codUsuario", ""+codUsuario);
                                            }
                                        }
                                        next="/dinamica/apoderado/inicio.html";
                                        break;
                                    case 5: // DOCENTE
                                        if(codPersona!=0){
                                            session.setAttribute("s_cod_persona", ""+codPersona);
                                            session.setAttribute("codUsuario", ""+codUsuario);
                                        }
                                        carpeta = "docente";
                                        next="/dinamica/docente/inicio.html";
                                        break;
                                    case 6: // DIRECTIVO
                                        System.out.println("ENTRO POR ACA");
                                        if(codPersona!=0){
                                            session.setAttribute("s_cod_persona", ""+codPersona);
                                            session.setAttribute("codUsuario", ""+codUsuario);
                                        }
                                        System.out.println("ENTRO POR ACA B");
                                        next="/dinamica/director/inicio.html";
                                        System.out.println(next);
                                        carpeta = "director";
                                        break;
                                    case 7: // AUXILIAR
                                        if(codPersona!=0){
                                            session.setAttribute("s_cod_persona", ""+codPersona);
                                            session.setAttribute("codUsuario", ""+codUsuario);
                                        }
                                        next="/dinamica/auxiliar/inicio.html";
                                        carpeta = "auxiliar";

                                        break;
                                    case 8: // DEPT. DE EVALUACION
                                        carpeta = "dpto_evaluacion";
                                        break;

                                   case 9: // SECRETARIA
                                        if(codPersona!=0){
                                            session.setAttribute("s_cod_persona", ""+codPersona);
                                            session.setAttribute("codUsuario", ""+codUsuario);
                                        }
                                        next="/dinamica/secretaria/inicio.html";
                                        carpeta = "secretaria";

                                        break;
                                    default:
                                        mensaje = "Este usuario no tiene permisos asignados..!";
                                        session.setAttribute("s_mensaje", mensaje);
                                        next="/dinamica/mensaje.jsp";
                                }
                                session.setAttribute("s_persona", nombrePersona);
                                session.setAttribute("s_carpeta", carpeta);
                                // Listar permisos
                                if (codTipo != 0) {
                                    if (true) {
                                        UsuarioLOG lUsuarioWeb = new UsuarioLOG(); 
                                        permisos = lUsuarioWeb.buscaPermisos(codTipo);
                                    }
                                    if (permisos == null) {
                                        mensaje += "\n Nombre de usuario no tiene permisos..!";
                                        session.setAttribute("s_mensaje", mensaje);
                                    } else {
                                        session.setAttribute("s_permisos", permisos);
                                    }
                                }
                            } else {
                                mensaje = "Usuario o clave incorrecta ..!";
                                request.setAttribute("r_mensaje", mensaje);
                                request.setAttribute("r_msg1", msgPool);
                                next="/dinamica/mensaje.jsp";
                            }
                        }
                        icono = "info";
                        session.setAttribute("s_ocultar_sesion", true);
                    } else if (msgDriver != null){
                        mensaje = "No se realizo la conexion a la base de datos del colegio ..! "; 
                        String msg1 = msgDriver;
                        request.setAttribute("r_mensaje", mensaje);
                        request.setAttribute("r_msg1", msg1);
                        icono = "error";
                        next="/dinamica/mensaje.jsp";
                    } else {
                        // cararter hexadecimal %0D para el salto de linea
                        mensaje = "No se realizo la conexion a la base de datos del colegio ..! "; 
                        String msg1 = "Pruebe cambiando el nombre del host ";
                        String msg2 = "Verifique si el servidor esta encendido ";
                        String msg3 = "Verifique si esta levantado el servicio de PostgreSQL ";
                        String msg4 = "Compruebe que el servidor de aplicaciones no esta corrupto";
                        String msg5 = "Verifique si hay internet para las conexiones VPN";
                        String msg6 = "Pool de conexiones: " + msgPool;
                        request.setAttribute("r_mensaje", mensaje);
                        request.setAttribute("r_msg1", msg1);
                        request.setAttribute("r_msg2", msg2);
                        request.setAttribute("r_msg3", msg3);
                        request.setAttribute("r_msg4", msg4);
                        request.setAttribute("r_msg5", msg5);
                        request.setAttribute("r_msg6", msg6);
                        icono = "error";
                        next="/dinamica/mensaje.jsp";
                    }
                    request.setAttribute("icono", icono);
                    break;
////////////////////////////////////////////////////////////////////////////////                    
                case 2: //Cerramos la sesion del usuario
                    //invalidar las sessiones
                    
                    session.invalidate();
                    //volver activar la session
                    session = request.getSession(true);
                    session.setAttribute("s_ocultar_sesion", false);
                    //next="/dinamica/frames/cabecera.jsp";
                    next="/dinamica/inicio.jsp"; // no salio no responden todas la paginas
                   
                    //next="/dinamica/index.jsp";
                    break;
////////////////////////////////////////////////////////////////////////////////                    
                case 3: //Olvido contraseña
                    id = (String)request.getParameter("txtID").trim();
                    codigo = (id == null) ? 0 : Integer.parseInt(id);
                    
                    if (true) {
                        UsuarioWeb bUsuarioWeb = new UsuarioWeb(true); //para no entrar a inicializar variables de paginacion
                        bUsuarioWeb.setCodUsuarioWeb(codigo);
                        UsuarioLOG lUsuarioWeb = new UsuarioLOG();
                        verificaID = lUsuarioWeb.verificarID(bUsuarioWeb);
                        preguntaSecreta = bUsuarioWeb.getPreguntaSecreta();
                    }
                    session.setAttribute("s_olvido_clave", verificaID);
                    session.setAttribute("s_ID", id);
                    session.setAttribute("s_pregunta_secreta", preguntaSecreta);
                    next="/dinamica/recuperar_paswd.jsp";
                    break;                    
////////////////////////////////////////////////////////////////////////////////                    
                case 4: //Recuperar contraseña
                    id = (session.getAttribute("s_ID") == null) ? "0" : (String) session.getAttribute("s_ID");
                    codigo = Integer.parseInt(id);
                    preguntaSecreta = (String)session.getAttribute("s_pregunta_secreta");
                    respuestaSecreta = (String)request.getParameter("txtRespuesta").trim();
                    
                    if (true) {
                        UsuarioWeb bUsuarioWeb = new UsuarioWeb(true); //para no entrar a inicializar variables de paginacion
                        bUsuarioWeb.setCodUsuarioWeb(codigo);
                        bUsuarioWeb.setPreguntaSecreta(preguntaSecreta);
                        bUsuarioWeb.setRespuestaSecreta(respuestaSecreta);
                    
                        UsuarioLOG lUsuarioWeb = new  UsuarioLOG();
                        recuperaCuenta = lUsuarioWeb.recuperarCuenta(bUsuarioWeb);
                    }
                    session.setAttribute("s_recuperar_clave", recuperaCuenta);
                    //session.setAttribute("s_ID", xId);
                    //session.setAttribute("s_pregunta_secreta", bean.getPreguntaSecreta());
                    session.setAttribute("s_respuesta_secreta", respuestaSecreta);
                    
                    next="/dinamica/mostrar_paswd.jsp";
                    break;
////////////////////////////////////////////////////////////////////////////////
                case 5: //Ir al inicio
                    destroy();
                    next="/estatica/index.jsp";
                    break;
                ////////////////////////////////////////////////////////////////////////////////
                case 6: //Iniciar sesion
                    next="/dinamica/index.jsp";
                    break;
                case 7: //Desconectarse de la BD
                    
                    //next="/dinamica/index.jsp";
                    break;
            }
            request.setAttribute("r_estilo", true); 
            //redirijimos la accion a otra pagina
            //if (li_tipo_cons != 7) {
                rd=this.getServletContext().getRequestDispatcher(next);
                rd.forward(request,response);
            //}
        } catch (Throwable t) {
            out.println(t.toString());
            t.printStackTrace();
        }
        // Cerramos etiquetas html
        out.println("</body></html>");
        out.close();
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        procesaConsulta(request, response);
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        procesaConsulta(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}
